package com.yfp.device.service;

import com.yfp.device.domain.*;
import com.yfp.device.domain.dto.*;
import com.yfp.device.domain.vo.ForeshowVo;
import com.yfp.device.domain.vo.MachineDebugLogVo;
import com.yfp.device.domain.vo.MachineRoadVo;
import com.yfp.device.domain.vo.ReplenishVo;
import com.yfp.device.enums.CheckTypeEnum;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 机器服务
 */
public interface MachineService {
    /**
     * 更新机器经纬度
     *
     * @param machineSn 机器编号
     * @param longitude 经度
     * @param latitude  纬度
     * @return 响应提
     */
    R<?> updateLatAndLon(String machineSn, String longitude, String latitude);

    /**
     * 更新机器温度
     *
     * @param machineSn   机器编号
     * @param temperature 温度
     * @return 响应体
     */
    R<?> updateTemperature(String machineSn, String temperature);

    /**
     * 上报设备部件状态
     *
     * @param machineSn     机器编号
     * @param checkTypeEnum 部件类型
     * @param isWork        状态 1：正常 0：异常
     * @return 响应体
     */
    R<?> reportComponent(String machineSn, CheckTypeEnum checkTypeEnum, Integer isWork);

    /**
     * 上传设备日志文件
     *
     * @param machineSn 机器编号
     * @param logFile   日志文件
     * @return 响应体
     */
    R<?> uploadLogFile(String machineSn, MultipartFile logFile);

    /**
     * 机器报损
     *
     * @param machineSn    机器编号
     * @param userName     用户名
     * @param machineRoads 货道
     * @return 响应体
     */
    R<?> damageReport(String machineSn, String userName, List<MachineRoadVo> machineRoads);

    /**
     * 同步货道库存
     *
     * @param machineSn      机器编号
     * @param userName       用户名
     * @param machineRoadVos 货道
     * @return 响应体
     */
    R<?> syncRoadInventory(String machineSn, String userName, List<MachineRoadVo> machineRoadVos);

    /**
     * 上传埋点日志文件
     *
     * @param machineSn      机器
     * @param type           类型
     * @param eventTrackFile 埋点文件
     * @return 响应体
     */
    R<?> uploadEventTrackFile(String machineSn, Integer type, MultipartFile eventTrackFile);

    /**
     * 同步告警
     *
     * @param request 请求体
     * @return 响应体
     */
    R<?> syncWarn(SyncWarnRequest request);

    /**
     * 故障上报
     *
     * @param request 请求体
     * @return 响应体
     */
    R<?> reportError(ReportErrorRequest request);

    /**
     * 修复故障
     *
     * @param machineSn  机器编号
     * @param errCode    故障代码
     * @param repairTime 修复时间
     * @return 响应体
     */
    R<?> repairError(String machineSn, String errCode, String repairTime);

    /**
     * 上报VMC连接状态
     *
     * @param machineSn 机器编号
     * @param vmcStatus VMC连接状态
     * @return 响应体
     */
    R<?> reportVMCStatus(String machineSn, String vmcStatus);

    /**
     * 设备在线
     *
     * @param machineSn 设备编号
     * @return 响应体
     */
    R<?> online(String machineSn);

    /**
     * 更新广告状态
     *
     * @param machineSn  机器编号
     * @param adId       广告id
     * @param playStatus 播放状态（1：待播放 2：播放中 3：已结束）
     * @return 响应体
     */
    R<?> updateAdStatus(String machineSn, String adId, Integer playStatus);

    /**
     * 查询机器编号
     *
     * @param machineSn 设备id
     * @return 响应体
     */
    R<String> qryMachineSerial(String machineSn);

    /**
     * 查询设备id
     *
     * @param machineSerial 机器编号
     * @return 响应体
     */
    R<String> qryMachineSn(String machineSerial);

    /**
     * 查询设备运营时间
     *
     * @param machineSn 机器编号
     * @return 响应体
     */
    R<QryMachineOpTimeResponse> qryMachineOpTime(String machineSn);

    /**
     * 检查机器编号
     *
     * @param machineSn 机器编号
     * @return 响应体
     */
    R<?> checkMachineSn(String machineSn);

    /**
     * 更新运营状态
     *
     * @param machineSn       机器编号
     * @param operationStatus 运营状态（1：运营中，2：休息中 3：故障中 4: 补货）
     * @return 响应体
     */
    R<?> updateOperationStatus(String machineSn, Integer operationStatus);

    /**
     * 获取机器信息
     *
     * @param machineSn 机器编号
     * @return 响应体
     */
    R<?> qryMachineInfo(String machineSn);

    /**
     * 查询日志文件
     *
     * @param request 请求体
     * @return 响应体
     */
    R<QryLogFilesResponse> qryLogFiles(QryLogFilesRequest request);

    /**
     * 上传调试日志
     *
     * @param machineDebugLogVo 请求体
     * @return 响应体
     */
    R<?> uploadDebugLog(MachineDebugLogVo machineDebugLogVo);

    /**
     * 查询调试日志
     *
     * @param request 请求体
     * @return 响应体
     */
    R<QryDebugLogsResponse> qryDebugLogs(QryDebugLogsRequest request);

    /**
     * 同步库存
     *
     * @param machineSn 机器编号
     * @return 响应体
     */
    R<SyncMachineRoadResponse> syncMachineRoad(String machineSn);

    /**
     * 获取设备库存报警阈值
     *
     * @param machineSn 机器编号
     * @return 响应体
     */
    R<QryMachineThresholdResponse> qryMachineThreshold(String machineSn);

    Machine getById(String machineId);

    /**
     * 上报暂存柜空余数量
     *
     * @param machineId
     * @param count
     * @return
     */
    R<String> reportTemporaryLockers(String machineId, String count);

    /**
     * 设备上报收到立即制作信息
     *
     * @return
     */
    R<String> reportPackageStatus(PackageStatus packageStatus);

    /**
     * 获取线上库存信息
     *
     * @return
     */
    R<List<DeviceCurrentComboStock>> getDeviceComboStockInfo();

    /**
     * 获取明日投放计划
     *
     * @return
     */
    R<List<ForeshowVo>> deviceComboForecastList();

    /**
     * 获取投放计划
     *
     * @return
     */
    R<List<ReplenishVo>> devicePlacementPlanSyncPreview();

    /**
     * 提交投放计划
     *
     * @return
     */
    R<List<ReplenishVo>> devicePlacementPlanSync();

    /**
     * 修改库存
     *
     * @param dccprs
     * @return
     */
    R<?> deviceComboStockSync(List<DeviceCurrentComboPlanRoad> dccprs);

    /**
     * 立即制作套餐
     *
     * @param makePackageDTO
     * @return
     */
//    R<?> makePackage(MakePackageDTO makePackageDTO);

    /**
     * 根据machineId查询设备信息
     *
     * @param machineId
     * @return
     */
    Machine findByMachineId(String machineId);

    /**
     * 定时任务钉钉发送报警信息
     */
    void  sendWeiXin();

    /**
     * 根据设备id和货道号修改库存
     * @param updateByMachineIdAndRoadNumDTO
     */
    void updateByMachineIdAndRoadNum(UpdateByMachineIdAndRoadNumDTO updateByMachineIdAndRoadNumDTO);
}
